/*
 *  include/clinux/mm.h
 *
 *  last modified at 2007.07.15 00:32 by ChenJie
 *
 */

#ifndef MM_H
#define MM_H

#include <clinux/config.h>

// 所能管理的最大页面数
#define MM_MAX_PAGES	(MM_MAX_MEMORY/MM_PAGE_SIZE)

// 扩展内存开始的位置(KB)
#define EXT_MM_START	(1*1024)

//
#define MM_BUSY		1
#define MM_FREE		0

// 对addr进行页对齐
#define PAGE_ALIGN(addr) \
	(((addr) & 0x0fff)?((((addr)>>12) +1) << 12):(addr))

// 取addr所在页的地址:
#define PAGE_ADDR(addr)  (addr & 0xfffff000)
						      
						      
//内存管理器的全局变量
//物理内存大小：
extern unsigned long mm_size;

//内存管理器初始化
void mm_init(unsigned long ext_mm_size);

//分配一页物理内存：
unsigned long mm_alloc_page(void);

//释放一页物理内存：
void mm_free_page(unsigned long p_addr);

//Task0设置用户态所使用的页表
void copy_kernel_pages_to_user(unsigned long kernel_start,
		unsigned long kernel_size,
		unsigned long user_start);

//创建新进程的页表目录, 用于fork:
unsigned long * create_pg_dir_from(unsigned long * old_pg_dir);

//page_fault处理函数:
int mm_do_page_fault(unsigned long flags, unsigned long linear_addr);

#endif // MM_H
